﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Otgruzka.ServicesClients;
using BusinessLogic.Security;
using BusinessLogic;
using BusinessLogic.Statuses;
using Otgruzka.Helpers;
using Common;
using DataTier.Entities;
using System.ServiceModel;
using DataTier;

namespace Otgruzka.Controls.ExpendBill
{
    public partial class ExpendBillDetails : System.Web.UI.UserControl
    {
        protected string Title
        {
            get 
            {
                try
                {
                    return (ExpendBillEntity != null && ExpendBillEntity.Order != null && ExpendBillEntity.Order.Header != null)
                        ? string.Format("Расходная накладная № &nbsp; {0}<br />к Заказу № &nbsp; {1} &nbsp;&nbsp;&nbsp; от {2:dd.MM.yyyy}", ExpendBillEntity.ExpendBill.NumberTotal, ExpendBillEntity.Order.Header.Number, ExpendBillEntity.Order.Header.CreatedDate)
                        : "Расходная накладная";
                }
                catch (Exception ex)
                {
                    return "Расходная накладная";
                }
            }
        }
        protected int OrderId
        {
            get
            {
                try
                {
                    int orderId = Convert.ToInt32(Request.QueryString["oid"]);
                    return orderId;
                }
                catch (Exception ex)
                {
                    return 0;
                }
            }
        }
        protected int ExpendBillId
        {
            get
            {
                try
                {
                    int expendBillId = Convert.ToInt32(Request.QueryString["exbid"]);
                    return expendBillId;
                }
                catch (Exception ex)
                {
                    return 0;
                }
            }
        }
        protected string StatusName
        {
            get
            {
                try
                {
                    return (ExpendBillEntity != null && ExpendBillEntity.State != null)
                        ? string.Format("{0}", ExpendBillEntity.State.Name)
                        : "Новая";
                }
                catch (Exception ex)
                {
                    return "";
                }
            }
        }

        protected OrderEntity OrderEntity
        {
            get
            {
                var orderEntity = ViewState["OrderEntity"] as OrderEntity;
                if (orderEntity != null)
                {
                    return orderEntity;
                }
                else
                {
                    return GetOrderEntity(); //new OrdersClient().GetOrder(UserPrincipal.Current.UserId, OrderId);
                }
            }
        }
        protected ExpendBillEntity ExpendBillEntity
        {
            get
            {
                var expendBill = ViewState["ExpendBill"] as ExpendBillEntity;
                if (expendBill != null)
                {
                    return expendBill;
                }
                else
                {
                    return new ExpendBillsClient().CreateNewExpendBill(UserPrincipal.Current.UserId, OrderId);
                }
            }
        }


        protected void Page_Load(object sender, EventArgs e)
        {
        }


        protected void Page_PreRender(object sender, EventArgs e)
        {
            BindExpendBill();
            SetButtonsVisibility();
        }


        private void BindExpendBill()
        {
            //this.ExpendBillDate.SelectedDate = DateTime.Now;

            if (Request.QueryString["oid"] != null)
            {
                try
                {   
                    // Получение нового объекта Расходная накладная
                    var expendBill = GetExpendBillEntity();
                    if (expendBill == null && ExpendBillId > 0)
                    {
                        this.ErrorMessage.Text = string.Format("Расходной накладной с ID={0} не обнаружено в базе данных!", ExpendBillId);
                        return;
                    }
                    ViewState["ExpendBill"] = expendBill;

                    this.Products.DataSource = ExpendBillEntity.Specification;
                    this.Products.DataBind();

                    if (ExpendBillEntity.ExpendBill.ExpendBillDate.HasValue)
                        ExpendBillDate.SelectedDate = ExpendBillEntity.ExpendBill.ExpendBillDate;


                    //Получение объекта Заказ
                    var orderEntity = GetOrderEntity();

                    //if (!IsPostBack)
                    //{
                    //    // FAKE: удаляю т.к. изначально формируется Расходная накладная из ВСХ строк Заказа
                    //    var ospec = orderEntity.Specification.ToList();
                    //    ospec.Clear();
                    //    orderEntity.Specification = ospec.ToArray();
                    //}
                    ViewState["OrderEntity"] = orderEntity;
                    if (!IsPostBack)
                        UpdateProductList();

                    this.OrderProducts.DataSource = OrderEntity.Specification;
                    this.OrderProducts.DataBind();
                }
                catch (Exception ex)
                { }
            }
        }

        private OrderEntity GetOrderEntity()
        {
            if (!IsPostBack)
            {
                var client = new OrdersClient();
                try
                {
                    var orderEntity = client.GetOrder(UserPrincipal.Current.UserId, OrderId);

                    // Выборка всех связаных Расходных накладных
                    var ebClient = new ExpendBillsClient();
                    try
                    {
                        //Request.QueryString["exbid"]
                        var expendBillList = ebClient.GetExpendBillList(UserPrincipal.Current.UserId, UserPrincipal.Current.OnliIts, OrderId); // Получение списка Расходных накладных, выписанных из указанного заказа
                        if (expendBillList != null && expendBillList.Count > 0 && orderEntity != null)
                        {
                            expendBillList = expendBillList.Where(b => b.ExpendBillId != ExpendBillId).ToList();

                            // Фильтруем Заказ удаляя товары, на которые уже есть выписанные расходные накладные, исключая текущую
                            foreach (var bill in expendBillList)
                            {
                                foreach (var bSpec in bill.Specification)
                                {
                                    var oSpec = orderEntity.Specification.Where(os => os.Specification.ProductId == bSpec.ProductId).FirstOrDefault();
                                    if (oSpec != null)
                                    {
                                        // Уменьшается количество товара в спецификации Заказа на количество уже выписанного
                                        oSpec.Specification.Count -= bSpec.Count;
                                        oSpec.Specification.Summa = ((oSpec.Specification.Price.HasValue) ? oSpec.Specification.Price.Value : 0.0) * (double)oSpec.Specification.Count;
                                    }
                                }
                            }
                        }
                    }
                    catch (System.ServiceModel.FaultException<ExceptionDetail> ex)
                    {
                        string message = ebClient.GetExceptionDetail(ex);
                        this.ErrorMessage.Text = message;
                        return null;
                    }
                    catch (System.Exception exp)
                    {
                        this.ErrorMessage.Text = exp.Message;
                        return null;
                    }

                    return orderEntity;
                }
                catch (System.ServiceModel.FaultException<ExceptionDetail> ex)
                {
                    string message = client.GetExceptionDetail(ex);
                    this.ErrorMessage.Text = message;
                    return null;
                }
                catch (System.Exception exp)
                {
                    this.ErrorMessage.Text = exp.Message;
                    return null;
                }
            }
            else
            {
                var orderEntity = ViewState["OrderEntity"] as OrderEntity;
                return orderEntity;
            }
        }

        private ExpendBillEntity GetExpendBillEntity()
        {
            if (!IsPostBack)
            {
                var client = new ExpendBillsClient();
                try
                {

                    var expendBill = (Request.QueryString["exbid"] != null)
                        ? client.GetExpendBill(UserPrincipal.Current.UserId, ExpendBillId) // Получение объекта Расходная накладная из базы данных
                        : client.CreateNewExpendBill(UserPrincipal.Current.UserId, OrderId); // Получение нового объекта Расходная накладная

                    return expendBill;
                }
                catch (System.ServiceModel.FaultException<ExceptionDetail> ex)
                {
                    string message = client.GetExceptionDetail(ex);
                    this.ErrorMessage.Text = message;
                    return null;
                }
                catch (System.Exception exp)
                {
                    this.ErrorMessage.Text = exp.Message;
                    return null;
                }
            }
            else
            {
                var expendBill = ViewState["ExpendBill"] as ExpendBillEntity;
                return expendBill;
            }
        }


        /// <summary>
        /// Отображает доступные кнопки перехода в статусы
        /// </summary>
        void SetButtonsVisibility()
        {
            this.btnSaveExpendBill.Visible = this.btnExecExpendBill.Visible = this.btnDeleteExpendBill.Visible = this.btnRefreshProducts.Visible = false;

            try
            {
                int currentId = ExpendBillEntity.ExpendBill.Id;
                int currentStatus = ExpendBillEntity.ExpendBill.StateId;

                var nextStatuses = new NextStatusGetter().GetNextStatuses(currentStatus);

                this.btnSaveExpendBill.Visible = nextStatuses.Contains((int)StateEnum.ExpendBillSaved) && UserPrincipal.Current.ExistStatePermission((int)StateEnum.ExpendBillSaved);
                this.btnExecExpendBill.Visible = nextStatuses.Contains((int)StateEnum.ExpendBillExecuted) && UserPrincipal.Current.ExistStatePermission((int)StateEnum.ExpendBillExecuted);
                
                // Возможно, надо создать права доступа на кнопку Обновления товаров в спецификции
                this.btnRefreshProducts.Visible = nextStatuses.Contains((int)StateEnum.ExpendBillExecuted);
                // Возможно, надо создать права доступа на кнопку отката статуса до состояния  "Сохранена"
                this.btnRollBackState.Visible = currentStatus == (int)StateEnum.ExpendBillExecuted;

                // Кнопка удаления доступна только для Расходных накладных в статусе Сохранена
                this.btnDeleteExpendBill.Visible = (currentStatus == (int)StateEnum.ExpendBillSaved) ? true : false;
            }
            catch (System.ServiceModel.FaultException<ExceptionDetail> ex)
            {
                var client = new ExpendBillsClient();
                string message = client.GetExceptionDetail(ex);
                this.ErrorMessage.Text = message;
            }
            catch (System.Exception exp)
            {
                this.ErrorMessage.Text = exp.Message;
            }
        }


        /// <summary>
        /// Событие заполнения строки грида данными
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void Products_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            if ((ExpendBillEntity != null) && (ExpendBillEntity.State != null) && (ExpendBillEntity.State.Id == (int)StateEnum.ExpendBillExecuted))
            {
                if (e.Row.RowType == DataControlRowType.DataRow)
                {
                    var Quantity = e.Row.FindControl("Quantity") as TextBox;
                    if (Quantity != null)
                        Quantity.Attributes.Add("disabled", "disabled");

                    var btnDeleteProduct = e.Row.FindControl("btnDeleteProduct") as ImageButton;
                    if (btnDeleteProduct != null)
                        btnDeleteProduct.Visible = false;
                }
            }
        }

        /// <summary>
        /// Событие заполнения строки грида данными
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void OrderProducts_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            if ((ExpendBillEntity != null) && (ExpendBillEntity.State != null) && (ExpendBillEntity.State.Id == (int)StateEnum.ExpendBillExecuted))
            {
                if (e.Row.RowType == DataControlRowType.DataRow)
                {

                    var btnAddToExpendBillProduct = e.Row.FindControl("btnAddToExpendBillProduct") as ImageButton;
                    if (btnAddToExpendBillProduct != null)
                        btnAddToExpendBillProduct.Visible = false;
                }
            }
        }


        /// <summary>
        /// Кнопка удаления текущей Расходной накладной
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void btnDeleteExpendBill_Click(object sender, EventArgs e)
        {
            var client = new ExpendBillsClient();
            try
            {
                client.DeleteExpendBill(UserPrincipal.Current.UserId, ExpendBillId);

                //Переход на страницу с деталями Заказа
                Response.Redirect(string.Format("~/WebForms/OrderDetails.aspx?oid={0}", OrderId));
            }
            catch (System.ServiceModel.FaultException<ExceptionDetail> ex)
            {
                string message = client.GetExceptionDetail(ex);
                this.ErrorMessage.Text = message;
            }
            catch (System.Exception exp)
            {
                this.ErrorMessage.Text = exp.Message;
            }
        }


        /// <summary>
        /// Кнопка обновления Списка Товаров после ввода в текстовые поля количества товаров.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void btnUpdateProductList_Click(object sender, EventArgs e)
        {
            UpdateProductList();
        }

        private void UpdateProductList()
        {
            foreach (GridViewRow item in Products.Rows)
            {
                var txtQuantityValue = ((TextBox)item.FindControl("Quantity")).Text;
                var txtProductIdValue = ((Label)item.FindControl("ProductId")).Text;
                var txtRowIdValue = ((Label)item.FindControl("RowId")).Text;
                if (!string.IsNullOrEmpty(txtRowIdValue) && !string.IsNullOrEmpty(txtProductIdValue))
                {
                    try
                    {
                        int newQuantity = Convert.ToInt32(txtQuantityValue);
                        int productId = Convert.ToInt32(txtProductIdValue);
                        int rowId = Convert.ToInt32(txtRowIdValue);
                        var expendBill = ExpendBillEntity;
                        var orderEntity = OrderEntity;
                        //var orderspec = expendBill.Order.Specification.Where(s => s.Specification.ProductId == productId).FirstOrDefault();
                        //var orderspec = orderEntity.Specification.Where(s => s.Specification.ProductId == productId).FirstOrDefault();

                        var billSpecProduct = expendBill.Specification.Where(s => s.ProductId == productId).FirstOrDefault();
                        if (billSpecProduct != null && billSpecProduct.Count >= newQuantity)
                        {
                        //if (orderspec != null && orderspec.Specification.Count >= newQuantity)
                        //{
                            // Редактируются значения количества заказанных товаров из спецификации Расходная накладная
                            var listSpec = expendBill.Specification.ToList();
                            var row = listSpec.Where(s => s.RowId == rowId).FirstOrDefault();
                            if (row != null)
                            {
                                int rowOldValue = row.Count;
                                row.Count = Convert.ToInt32(txtQuantityValue);
                                row.Summa = ((double)row.Count) * (row.Price.HasValue ? row.Price.Value : 0.0);
                                expendBill.Specification = listSpec;
                                expendBill.ExpendBill.ItogoSumm = GetItogoSumm(expendBill);

                                int rowid = 0;

                                // Редактируется строка в спецификации Заказа
                                if (orderEntity.Specification != null)
                                {
                                    var orderspec = orderEntity.Specification.Where(s => s.Specification.ProductId == productId).FirstOrDefault();

                                    //////////////////////////////////////////////////////////////////
                                    var ospeclist = orderEntity.Specification.Where(s => s.IsShipped == false).ToList();
                                    //////////////////////////////////////////////////////////////////
                                    var ospec = ospeclist.Where(s => s.Specification.ProductId == productId).FirstOrDefault();
                                    if (ospec != null)
                                    {
                                        // Обновление строки с товаром в спецификации Заказа
                                        if (!IsPostBack)
                                        {
                                            ospec.Specification.Count = ospec.Specification.Count - row.Count;
                                        }
                                        else if (IsPostBack && (rowOldValue != newQuantity))
                                        {
                                            int fullCount = rowOldValue + ospec.Specification.Count;
                                            ospec.Specification.Count = fullCount - newQuantity;
                                        }

                                        ospec.Specification.Summa = ((double)ospec.Specification.Count) * (ospec.Specification.Price.HasValue ? ospec.Specification.Price.Value : 0.0);

                                        // Если получается кол-во = 0, то строка удаляется из спецификации
                                        if (ospec.Specification.Count <= 0)
                                            ospeclist.Remove(ospec);
                                    }
                                    else
                                    {
                                        // Добавление новой строки с товаром в спецификацию Заказа
                                        rowid = (ospeclist != null && ospeclist.Count > 0)
                                            ? ospeclist.Select(s => s.Specification.RowId).Max()
                                            : 0;
                                        rowid++;

                                        #region Создание нового объекта OrderSpecEntity
                                        ospec = new OrderSpecEntity();
                                        ospec.Specification = new OrderSpec()
                                        {
                                            ProductId = row.ProductId,
                                            Artikul = row.Artikul,
                                            ProductName = row.ProductName,
                                            Price = row.Price,
                                            IsUnavailable = row.IsUnavailable,
                                            SupplierName = row.SupplierName,
                                            SupplierArtikul = row.SupplierArtikul,
                                            Count = (orderspec == null) ? (rowOldValue - newQuantity) : (orderspec.Specification.Count - newQuantity),
                                            Summa = ((orderspec == null) ? (rowOldValue - newQuantity) : (orderspec.Specification.Count - newQuantity)) * (row.Price.HasValue ? row.Price.Value : 0.0),
                                            RowId = rowid
                                        };
                                        //ospec.Product = new OrdersServiceReference.Product()
                                        //{
                                        //    Artikul = row.Product.Artikul,
                                        //    GroupId = row.Product.GroupId,
                                        //    ImageBigUrl = row.Product.ImageBigUrl,
                                        //    ImageSmallUrl = row.Product.ImageSmallUrl,
                                        //    IsUnavailable = row.Product.IsUnavailable,
                                        //    ProductId = row.Product.ProductId,
                                        //    Price = row.Product.Price,
                                        //    SupplierArtikul = row.Product.SupplierArtikul,
                                        //    SupplierName = row.Product.SupplierName,
                                        //    ProductName = row.Product.ProductName
                                        //};
                                        #endregion Создание нового объекта OrderSpecEntity

                                        if (ospec.Specification.Count > 0)
                                            ospeclist.Add(ospec);

                                        orderEntity.Specification = ospeclist;
                                    }
                                    orderEntity.Specification = ospeclist;
                                }
                                else // Пустая спецификация
                                {
                                    // Добавление новой строки с товаром в спецификацию Заказа
                                    var newSpec = new List<OrderSpecEntity>();
                                    rowid++;

                                    #region Создание нового объекта OrderSpecEntity
                                    var ospec = new OrderSpecEntity();
                                    ospec.Specification = new OrderSpec()
                                    {
                                        ProductId = row.ProductId,
                                        Artikul = row.Artikul,
                                        ProductName = row.ProductName,
                                        Price = row.Price,
                                        IsUnavailable = row.IsUnavailable,
                                        SupplierName = row.SupplierName,
                                        SupplierArtikul = row.SupplierArtikul,
                                        //Count = (orderspec.Specification.Count - newQuantity),
                                        //Summa = (orderspec.Specification.Count - newQuantity) * (row.Price.HasValue ? row.Price.Value : 0.0),
                                        Count = (billSpecProduct.Count - newQuantity),
                                        Summa = (billSpecProduct.Count - newQuantity) * (row.Price.HasValue ? row.Price.Value : 0.0),
                                        RowId = rowid
                                    };
                                    //ospec.Product = new OrdersServiceReference.Product()
                                    //{
                                    //    Artikul = row.Product.Artikul,
                                    //    GroupId = row.Product.GroupId,
                                    //    ImageBigUrl = row.Product.ImageBigUrl,
                                    //    ImageSmallUrl = row.Product.ImageSmallUrl,
                                    //    IsUnavailable = row.Product.IsUnavailable,
                                    //    ProductId = row.Product.ProductId,
                                    //    Price = row.Product.Price,
                                    //    SupplierArtikul = row.Product.SupplierArtikul,
                                    //    SupplierName = row.Product.SupplierName,
                                    //    ProductName = row.Product.ProductName
                                    //};
                                    #endregion Создание нового объекта OrderSpecEntity

                                    if (ospec.Specification.Count > 0)
                                        newSpec.Add(ospec);

                                    orderEntity.Specification = newSpec;
                                }
                                ViewState["OrderEntity"] = orderEntity;

                                // Если получается кол-во = 0, то строка удаляется из спецификации
                                if (row.Count <= 0)
                                    listSpec.Remove(row);

                                expendBill.Specification = listSpec;
                                ViewState["ExpendBill"] = expendBill;
                            }
                        }
                        //else if (orderspec != null && orderspec.Specification.Count < Convert.ToInt32(txtQuantityValue))
                        else if (billSpecProduct != null && billSpecProduct.Count < Convert.ToInt32(txtQuantityValue))
                        {
                            // Введено количество, большее, чем есть в Заказе
                            //this.ErrorMessage.Text = string.Format("Введено кол-во, большее допустимого. Максимальное количество данного товара = {0}", orderspec.Specification.Count);
                            this.ErrorMessage.Text = string.Format("Введено кол-во, большее допустимого. Максимальное количество данного товара = {0}", billSpecProduct.Count);
                        }
                    }
                    catch (Exception ex)
                    { }
                }
            }
        }


        /// <summary>
        /// Кнопка сохранения Расходной накладной
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void btnSaveExpendBill_Click(object sender, EventArgs e)
        {
            var client = new ExpendBillsClient();
            try
            {
                // Запоминается выбранная дата, на какой день готовится накладная
                ExpendBillEntity.ExpendBill.ExpendBillDate = this.ExpendBillDate.SelectedDate;
                ExpendBillEntity.ExpendBill.ItogoSumm = GetItogoSumm(ExpendBillEntity);

                // Очищается объект от лишней неиспользуемой при сохранении информации т.к. wec-сервис не пропускает большой объем сериализованного объекта
                ExpendBillEntity.Order.Specification = null;
                //foreach (var spec in ExpendBillEntity.Specification)
                //    spec.Product = null;


                int expendBillId = client.SaveExpendBill(UserPrincipal.Current.UserId, ExpendBillEntity);

                //Перегрузить страницу чтобы показались изменения
                Response.Redirect(string.Format("~/WebForms/ExpendBillDetails.aspx?oid={0}&exbid={1}", OrderId, expendBillId), true);
                //if (Request.QueryString["exbid"] != null)
                //    Response.Redirect(string.Format("~{0}", Request.Url.PathAndQuery), true);
                //else
                //    Response.Redirect(string.Format("~{0}&exbid={1}", Request.Url.PathAndQuery, expendBillId), true);
            }
            catch (System.ServiceModel.FaultException<ExceptionDetail> ex)
            {
                string message = client.GetExceptionDetail(ex);
                this.ErrorMessage.Text = message;
            }
            catch (System.Exception exp)
            {
                this.ErrorMessage.Text = exp.Message;
            }
        }


        private double GetItogoSumm(ExpendBillEntity expendBillEntity)
        {
            double summa = 0.0;
            foreach (var spec in expendBillEntity.Specification)
            {
                summa += spec.Summa;
            }
            return summa;
        }


        /// <summary>
        /// Кнопка перевода Расходной накладной в статус Исполнена
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void btnExecExpendBill_Click(object sender, EventArgs e)
        {
            if (this.ExpendBillDate.SelectedDate.HasValue /*&& this.ExpendBillDate.SelectedDate.Value.Date <= DateTime.Today.Date*/)
            {
                var client = new StatesClient();
                try
                {
                    // Вызвать сервис смены статуса Расходной накладной
                    client.SetDocumentState(UserPrincipal.Current.UserId, (int)DocTypeEnum.ExpendBill, ExpendBillId, (int)StateEnum.ExpendBillExecuted);
                    string subject;

                    // Вызвать сервис смены статуса Заказа в Частично отгружен или Полностью отгружен (в зависимости от наличия неотгруженных товаров)
                    var order = OrderEntity;
                    if (order != null && order.Specification != null && order.Specification.Count() > 0)
                    {
                        // Частично отгруженный Заказ т.к. есть оставшиеся товары в Заказе
                        client.SetDocumentState(UserPrincipal.Current.UserId, (int)DocTypeEnum.Order, OrderId, (int)StateEnum.PartialDispatch);
                        subject = string.Format("Частично отгруженный Заказ № {0}", order.Header.Number);
                    }
                    else
                    {
                        // Полностью отгруженный Заказ
                        client.SetDocumentState(UserPrincipal.Current.UserId, (int)DocTypeEnum.Order, OrderId, (int)StateEnum.FullDispatch);
                        subject = string.Format("Полностью отгруженный Заказ № {0}", order.Header.Number);
                    }

                    //var oClient = new OrdersClient();
                    //var order2 = oClient.GetOrder(UserPrincipal.Current.UserId, OrderId);

                    var processor = new MessageProcessor();
                    string tableExpendBill = ObjectToHtmlHelper.GetExpedBillHTML_toEMail(ExpendBillEntity); //string tableOrder = ObjectToHtmlHelper.GetOrderHTML(order2);
                    string fromAddressName = UserPrincipal.Current.UserFullName;
                    
                    var clientSettings = new SettingsClient();

                    #region // Email ответственного менеджера: берется из свойств юр.лица. Если там пусто, то подставляется из системных настроек - таблицы "SystemSettings"
                    var settingIndepMngr = clientSettings.GetSettingValue("ManagerIndependetEMail");
                    string managerIndependetEMail = string.Empty;
                    if (settingIndepMngr != null && !string.IsNullOrEmpty(settingIndepMngr.SettingValue))
                        managerIndependetEMail = settingIndepMngr.SettingValue;
                    if (order != null && order.Header != null && order.Header.User != null && order.Header.User.CostsCenter != null && order.Header.User.CostsCenter.Department != null 
                        && order.Header.User.CostsCenter.Department.JuridicalPerson != null && !string.IsNullOrEmpty(order.Header.User.CostsCenter.Department.JuridicalPerson.ManagerEMail))
                    {
                        managerIndependetEMail = order.Header.User.CostsCenter.Department.JuridicalPerson.ManagerEMail;
                    }
                    #endregion // Email ответственного менеджера: берется из свойств юр.лица. Если там пусто, то подставляется из системных настроек - таблицы "SystemSettings"

                    var settingMegaMngr = clientSettings.GetSettingValue("ManagerEMail");

                    string email = string.Empty;
                    if (!string.IsNullOrEmpty(ExpendBillEntity.Order.Header.ContactEmail)) //if (!string.IsNullOrEmpty(order2.Header.ContactEmail))
                    {
                        email = ExpendBillEntity.Order.Header.ContactEmail; //email = order2.Header.ContactEmail;
                        //if (settingIndepMngr != null && !string.IsNullOrEmpty(settingIndepMngr.SettingValue))  //Копия отсылается менеджеру Индепендент Медия - Галине Рыбкиной
                        //    email = email + ", " + settingIndepMngr.SettingValue;
                    }
                    else
                    {
                        if (!string.IsNullOrEmpty(managerIndependetEMail))
                            email = managerIndependetEMail;

                        if (settingMegaMngr != null && !string.IsNullOrEmpty(settingMegaMngr.SettingValue))
                            email = email + (email.Length > 0 ? ", " : "") + settingMegaMngr.SettingValue;

                        subject = "В заказе не указан e-mail контактного лица!";
                    }
                    // Отправка письма по адресу из Заказа. Копия - Галине (куратору от Индепендент Медиа)
                    //processor.ProcessSendMessage(tableOrder, email, fromAddressName, subject, (settingMegaMngr != null && !string.IsNullOrEmpty(settingMegaMngr.SettingValue)) ? settingMegaMngr.SettingValue : null);
                    processor.ProcessSendMessage(tableExpendBill, email, fromAddressName, subject, (settingMegaMngr != null && !string.IsNullOrEmpty(settingMegaMngr.SettingValue)) ? settingMegaMngr.SettingValue : null);


                    //Перегрузить страницу чтобы показались изменения
                    Response.Redirect(string.Format("~/WebForms/ExpendBillDetails.aspx?oid={0}&exbid={1}", OrderId, ExpendBillId), true);
                    //Response.Redirect(string.Format("~{0}", Request.Url.PathAndQuery), true);
                }
                catch (System.ServiceModel.FaultException<ExceptionDetail> ex)
                {
                    string message = client.GetExceptionDetail(ex);
                    this.ErrorMessage.Text = message;
                }
                catch (System.Exception exp)
                {
                    this.ErrorMessage.Text = exp.Message;
                }
            }
            else
            {
                this.ErrorMessage.Text = "Не заполнена дата Расходной накладной!";
                //this.ErrorMessage.Text = "Нельзя исполнять Расходную накладную, если дата Расходной накладной больше текущей даты!";
            }
        }


        protected void btnBackToOrder_Click(object sender, EventArgs e)
        {
            Response.Redirect(string.Format("~/WebForms/OrderDetails.aspx?oid={0}", OrderId));
        }


        /// <summary>
        /// Кнопка удаления строки с Товаром из грида со спецификацией Расходной накладной
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void btnDeleteProduct_Click(object sender, ImageClickEventArgs e)
        {
            var button = sender as ImageButton;
            if (button != null && !string.IsNullOrEmpty(button.CommandArgument))
            {
                try
                {
                    int rowId = Convert.ToInt32(button.CommandArgument);
                    var expendBill = ExpendBillEntity;
                    var row = expendBill.Specification.ToList().Where(s => s.RowId == rowId).FirstOrDefault();
                    if (row != null) // строка из спецификации Расходная накладная
                    {
                        // Добавляется строка в спецификацию Заказа
                        var orderEntity = OrderEntity;
                        var olistSpec = (orderEntity.Specification != null) ? orderEntity.Specification : new List<OrderSpecEntity>();
                        var orow = olistSpec.Where(s => s.Specification.ProductId == row.ProductId).FirstOrDefault();
                        if (orow != null) // Если строка с товаром уже есть в спецификации Заказа
                        {
                            orow.Specification.Count += row.Count;
                            orow.Specification.Summa += row.Summa;
                        }
                        else // Если строки с товаром нет в спецификации Заказа
                        {
                            int rowid = (olistSpec !=null && olistSpec.Count > 0)
                                ? olistSpec.Select(s => s.Specification.RowId).Max()
                                : 0;
                            rowid++;

                            var orderSpec = new OrderSpecEntity();
                            orderSpec.Specification = new OrderSpec()
                                {
                                    ProductId = row.ProductId,
                                    Artikul = row.Artikul,
                                    ProductName = row.ProductName,
                                    Price = row.Price,
                                    IsUnavailable = row.IsUnavailable,
                                    SupplierName = row.SupplierName,
                                    SupplierArtikul = row.SupplierArtikul,
                                    Count = row.Count,
                                    Summa = row.Summa,
                                    RowId = rowid
                                };
                            //orderSpec.Product = new OrdersServiceReference.Product()
                            //{
                            //    Artikul = row.Product.Artikul,
                            //    GroupId = row.Product.GroupId,
                            //    ImageBigUrl = row.Product.ImageBigUrl,
                            //    ImageSmallUrl = row.Product.ImageSmallUrl,
                            //    IsUnavailable = row.Product.IsUnavailable,
                            //    ProductId = row.Product.ProductId,
                            //    Price = row.Product.Price,
                            //    SupplierArtikul = row.Product.SupplierArtikul,
                            //    SupplierName = row.Product.SupplierName,
                            //    ProductName = row.Product.ProductName
                            //};

                            olistSpec.Add(orderSpec);
                        }
                        orderEntity.Specification = olistSpec;
                        ViewState["OrderEntity"] = orderEntity;

                        // Удаляется строка из спецификации Расходная накладная
                        if (expendBill.Specification != null)
                        {
                            var listSpec = expendBill.Specification.ToList();
                            listSpec.Remove(row);
                            expendBill.Specification = listSpec;
                            expendBill.ExpendBill.ItogoSumm = GetItogoSumm(expendBill);
                            ViewState["ExpendBill"] = expendBill;
                        }
                    }
                }
                catch (Exception ex)
                { }
            }
        }


        /// <summary>
        /// Кнопка добавления строки с товаром в Расходную накладную из спецификации Заказа
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void btnAddToExpendBillProduct_Click(object sender, EventArgs e)
        {
            var button = sender as ImageButton;
            if (button != null && !string.IsNullOrEmpty(button.CommandArgument))
            {
                try
                {
                    int rowId = Convert.ToInt32(button.CommandArgument);
                    var orderEntity = OrderEntity;
                    var row = orderEntity.Specification.ToList().Where(s => s.Specification.RowId == rowId).FirstOrDefault();
                    if (row != null) // строка из спецификации Заказ
                    {
                        // Добавляется строка в спецификацию Расходной накладной
                        var expendBill = ExpendBillEntity;
                        var listSpec = (expendBill.Specification != null) ? expendBill.Specification.ToList() : new List<ExpendBillSpec>();
                        var ebrow = listSpec.Where(s => s.ProductId == row.Specification.ProductId).FirstOrDefault();
                        if (ebrow != null) // Если строка с товаром уже есть в спецификации Расходной накладной
                        {
                            ebrow.Count += row.Specification.Count;
                            ebrow.Summa += row.Specification.Summa;
                        }
                        else // Если строки с товаром нет в спецификации Расходной накладной
                        {
                            int rowid = (listSpec != null && listSpec.Count > 0)
                                ? listSpec.Select(s => s.RowId).Max()
                                : 0;
                            rowid++;

                            var billSpec = new ExpendBillSpec()
                                {
                                    ProductId = row.Specification.ProductId,
                                    Artikul = row.Specification.Artikul,
                                    ProductName = row.Specification.ProductName,
                                    Price = row.Specification.Price,
                                    IsUnavailable = row.Specification.IsUnavailable,
                                    SupplierName = row.Specification.SupplierName,
                                    SupplierArtikul = row.Specification.SupplierArtikul,
                                    Count = row.Specification.Count,
                                    Summa = row.Specification.Summa,
                                    RowId = rowid
                                };
                            //billSpec.Product = new ExpendBillServiceReference.Product()
                            //{
                            //    Artikul = row.Product.Artikul,
                            //    GroupId = row.Product.GroupId,
                            //    ImageBigUrl = row.Product.ImageBigUrl,
                            //    ImageSmallUrl = row.Product.ImageSmallUrl,
                            //    IsUnavailable = row.Product.IsUnavailable,
                            //    ProductId = row.Product.ProductId,
                            //    Price = row.Product.Price,
                            //    SupplierArtikul = row.Product.SupplierArtikul,
                            //    SupplierName = row.Product.SupplierName,
                            //    ProductName = row.Product.ProductName
                            //};

                            listSpec.Add(billSpec);
                        }
                        expendBill.Specification = listSpec;
                        ViewState["ExpendBill"] = expendBill;


                        // Удаляется строка из спецификации Заказ
                        if (orderEntity.Specification != null)
                        {
                            var olistSpec = orderEntity.Specification.ToList();
                            olistSpec.Remove(row);
                            orderEntity.Specification = olistSpec;
                            ViewState["OrderEntity"] = orderEntity;
                        }
                    }
                }
                catch (Exception ex)
                { }
            }
        }


        /// <summary>
        /// Событие нажатия кнопки Обновить товары
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void btnRefreshProducts_Click(object sender, EventArgs e)
        {
            if (ExpendBillId > 0)
            {
                var client = new ServicesClients.ExpendBillsClient();
                try
                {
                    client.RefreshExpendBillSpecAndOrderSpec(UserPrincipal.Current.UserId, ExpendBillId);
                    //Перегрузить страницу чтобы показались изменения
                    Response.Redirect(string.Format("~/WebForms/ExpendBillDetails.aspx?oid={0}&exbid={1}", OrderId, ExpendBillId), true);
                }
                catch (System.ServiceModel.FaultException<ExceptionDetail> ex)
                {
                    string message = client.GetExceptionDetail(ex);
                    this.ErrorMessage.Text = message;
                }
                catch (System.Exception exp)
                {
                    this.ErrorMessage.Text = exp.Message;
                }
            }
        }


        /// <summary>
        /// Событие нажатия кнопки Откатить статус
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void btnRollBackState_Click(object sender, EventArgs e)
        {
            if (ExpendBillId > 0)
            {
                var client = new StatesClient();
                try
                {
                    // Вызвать сервис смены статуса Расходной накладной
                    client.SetDocumentState(UserPrincipal.Current.UserId, (int)DocTypeEnum.ExpendBill, ExpendBillId, (int)StateEnum.ExpendBillSaved);

                    //Перегрузить страницу чтобы показались изменения
                    Response.Redirect(string.Format("~/WebForms/ExpendBillDetails.aspx?oid={0}&exbid={1}", OrderId, ExpendBillId), true);
                }
                catch (System.ServiceModel.FaultException<ExceptionDetail> ex)
                {
                    string message = client.GetExceptionDetail(ex);
                    this.ErrorMessage.Text = message;
                }
                catch (System.Exception exp)
                {
                    this.ErrorMessage.Text = exp.Message;
                }
            }
        }
    }
}